package com.yihusitian.leecode.algorithm.easy;

/**
 * 给你一个 32 位的有符号整数 x ，返回将 x 中的数字部分反转后的结果。
 *
 * 如果反转后整数超过 32 位的有符号整数的范围 [−2 31,  2 31 − 1] ，就返回 0。
 *
 * 假设环境不允许存储 64 位整数（有符号或无符号）。
 *
 */
public class ReverseInteger {


    public int reverse2(int x) {
        if (x == 0 || x == Integer.MIN_VALUE || x == Integer.MAX_VALUE) {
            return 0;
        }

        int result = 0;
        int partMinvalue = Integer.MIN_VALUE / 10;
        int partMaxvalue = Integer.MAX_VALUE / 10;
        while (x != 0) {
            if (result < partMinvalue || (result == partMinvalue && x < -8)) {
                return 0;
            }
            if (result > partMaxvalue || (result == partMaxvalue && x > 7)) {
                return 0;
            }
            result = result * 10 + x % 10;
            x /= 10;
        }
        return result;
    }

    public int reverse(int x) {
        if (x == 0 || x == Integer.MIN_VALUE || x == Integer.MAX_VALUE) {
            return 0;
        }

        int tempX = x < 0 ? -x : x;
        String strTempx = String.valueOf(tempX);
        String strMaxValue = x < 0 ? String.valueOf(Integer.MIN_VALUE).substring(1) : String.valueOf(Integer.MAX_VALUE);
        char[] tempXCharArray = strTempx.toCharArray();
        char[] maxValueCharArray = strMaxValue.toCharArray();
        int result = 0;
        boolean isMaxLength = tempXCharArray.length == maxValueCharArray.length;
        boolean isLastEqual = true;

        for (int i = 0; i < tempXCharArray.length; i ++) {
            int bitNum = tempX % 10;
            if (isMaxLength) {
                int t = Integer.valueOf(String.valueOf(maxValueCharArray[i]));
                if (bitNum > t && isLastEqual) {
                    return 0;
                }
                isLastEqual = bitNum == t;
            }
            result = result * 10 + bitNum;
            tempX = tempX / 10;
        }
        return result * (x < 0 ? -1 : 1);
    }

    public static void main(String[] args) {
//        System.out.println(Integer.MAX_VALUE);
        System.out.println(Integer.MIN_VALUE);
//        int[] bitnums = new int[10];
//        System.out.println(bitnums.length);
//        System.out.println(new ReverseInteger().reverse(-10102));
        System.out.println(new ReverseInteger().reverse(Integer.MIN_VALUE));


    }

}
